package 㤼㸱plotly㤼㸲 was built under R version 4.0.5Loading required package: ggplot2
package 㤼㸱ggplot2㤼㸲 was built under R version 4.0.3Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 methods overwritten by 'htmltools':
  method               from         
  print.html           tools:rstudio
  print.shiny.tag      tools:rstudio
  print.shiny.tag.list tools:rstudio
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

Attaching package: 㤼㸱plotly㤼㸲

The following object is masked from 㤼㸱package:ggplot2㤼㸲:

    last_plot

The following object is masked from 㤼㸱package:stats㤼㸲:

    filter

The following object is masked from 㤼㸱package:graphics㤼㸲:

    layout

package 㤼㸱dplyr㤼㸲 was built under R version 4.0.4
Attaching package: 㤼㸱dplyr㤼㸲

The following objects are masked from 㤼㸱package:stats㤼㸲:

    filter, lag

The following objects are masked from 㤼㸱package:base㤼㸲:

    intersect, setdiff, setequal, union

What do the results look like?

2021-04 Data

2021-05 Data

Plot

minimal value for n is 3, returning requested palette with 3 different levels
minimal value for n is 3, returning requested palette with 3 different levels
minimal value for n is 3, returning requested palette with 3 different levels
minimal value for n is 3, returning requested palette with 3 different levels

What happens if we try to plot a plane?

Check with dataset as a part of the model. (They should not be, as they are generated by the same code, but different seeds.)


Call:
lm(formula = log(CommunitySize) ~ log(Basals) + log(Consumers) + 
    Dataset, data = plotScalingData)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.83712 -0.17860  0.01358  0.20886  0.78899 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)     0.91641    0.11947   7.670 5.05e-11 ***
log(Basals)     0.23818    0.02014  11.825  < 2e-16 ***
log(Consumers)  0.03652    0.01856   1.968   0.0528 .  
Dataset2021-05  0.07433    0.07197   1.033   0.3050    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3089 on 75 degrees of freedom
Multiple R-squared:  0.677, Adjusted R-squared:  0.664 
F-statistic: 52.39 on 3 and 75 DF,  p-value: < 2.2e-16

Datasets do not look to have a statistically significant effect. Without comparing the models (would need to do in any publication), the model without the dataset effect is:


Call:
lm(formula = log(CommunitySize) ~ log(Basals) + log(Consumers), 
    data = plotScalingData)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.86732 -0.17301 -0.02186  0.20156  0.74221 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)     0.93258    0.11850   7.870 1.95e-11 ***
log(Basals)     0.24312    0.01957  12.421  < 2e-16 ***
log(Consumers)  0.03800    0.01851   2.053   0.0435 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.309 on 76 degrees of freedom
Multiple R-squared:  0.6724,    Adjusted R-squared:  0.6638 
F-statistic: 77.99 on 2 and 76 DF,  p-value: < 2.2e-16

Adding this to the plot:

minimal value for n is 3, returning requested palette with 3 different levels
minimal value for n is 3, returning requested palette with 3 different levels
minimal value for n is 3, returning requested palette with 3 different levels
minimal value for n is 3, returning requested palette with 3 different levels

Not particularly convincing, but it does agree with general ideas (consumers less important than basals).


Call:
lm(formula = log(CommunitySize) ~ log(Basals) + log(Consumers) - 
    1, data = plotScalingData)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.80814 -0.13633  0.05056  0.40151  1.03117 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
log(Basals)     0.33969    0.02041  16.642  < 2e-16 ***
log(Consumers)  0.14852    0.01614   9.202 4.89e-14 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.4136 on 77 degrees of freedom
Multiple R-squared:  0.9598,    Adjusted R-squared:  0.9587 
F-statistic: 918.9 on 2 and 77 DF,  p-value: < 2.2e-16
minimal value for n is 3, returning requested palette with 3 different levels
minimal value for n is 3, returning requested palette with 3 different levels
minimal value for n is 3, returning requested palette with 3 different levels
minimal value for n is 3, returning requested palette with 3 different levels

Call:
lm(formula = CommunitySize ~ log(Basals) + log(Consumers), data = plotScalingData)

Residuals:
   Min     1Q Median     3Q    Max 
-4.867 -1.628 -0.500  1.427  9.556 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)     0.09911    0.98519   0.101   0.9201    
log(Basals)     1.93666    0.16273  11.901   <2e-16 ***
log(Consumers)  0.26912    0.15390   1.749   0.0844 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.569 on 76 degrees of freedom
Multiple R-squared:  0.6525,    Adjusted R-squared:  0.6433 
F-statistic: 71.34 on 2 and 76 DF,  p-value: < 2.2e-16
minimal value for n is 3, returning requested palette with 3 different levels
minimal value for n is 3, returning requested palette with 3 different levels
minimal value for n is 3, returning requested palette with 3 different levels
minimal value for n is 3, returning requested palette with 3 different levels

How do they interact with each other (on islands)?

LS0tDQp0aXRsZTogIlZpa2luZyBSZXN1bHRzLCAyMDIxLTA1Ig0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KLS0tDQoNCmBgYHtyIGxpYnN9DQojIENoZWNrIHJlcXVpc2l0ZSBwYWNrYWdlcyBhcmUgaW5zdGFsbGVkLg0KcGFja2FnZXMgPC0gYygNCiAgInBsb3RseSIsIA0KICAiZHBseXIiDQopDQpmb3IgKHBrZyBpbiBwYWNrYWdlcykgew0KICBsaWJyYXJ5KHBrZywgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQ0KfQ0KYGBgDQoNCiMgV2hhdCBkbyB0aGUgcmVzdWx0cyBsb29rIGxpa2U/DQpgYGB7ciBkaXJzfQ0KZGlyVmlraW5nIDwtIGMoDQogIGZpbGUucGF0aCgNCiAgICBnZXR3ZCgpLCAiTENBQl9MYXdNb3J0b24xOTk2LU51bWVyaWNhbFBvb2xDb21tdW5pdHlTY2FsaW5nIg0KICApLA0KICBmaWxlLnBhdGgoDQogICAgZ2V0d2QoKSwgIkxDQUJfTGF3TW9ydG9uMTk5Ni1OdW1lcmljYWxQb29sQ29tbXVuaXR5U2NhbGluZzIiDQogICkNCikNCmRpclZpa2luZ1Jlc3VsdHMgPC0gZmlsZS5wYXRoKA0KICBkaXJWaWtpbmcsIGMoInJlc3VsdHMtMjAyMS0wNCIsICJzYXZlLTIwMjEtMDUtMTAiKSAjIExhdHRlciBub3QgMTAwJSB5ZXQuDQopDQpyZXN1bHRGb3JtYXQgPC0gcGFzdGUwKA0KICAicnVuLSIsIA0KICAiJWQiLCAjIENvbWJpbmF0aW9uIE51bWJlciwgb3IgQ29tYm5OdW0uDQogICItIiwgDQogICIlcyIsICMgUnVuIFNlZWQuDQogICIuUkRTIg0KKQ0KYGBgDQoNCiMjIDIwMjEtMDQgRGF0YQ0KYGBge3IgcGFyYW1zfQ0KIyBDb3BpZWQgZnJvbSBMYXdNb3J0b24xOTk2LU51bWVyaWNhbFBvb2xDb21tdW5pdHlTY2FsaW5nLUNhbGN1bGF0aW9uLlINCiMgVE9ETzogSW4gdGhlIGZ1dHVyZSwgbWFrZSB0aGlzIGEgc2VwYXJhdGUgZmlsZSB0aGF0IGV2ZXJ5b25lIGNhbiBjYWxsLi4uDQpzZXQuc2VlZCgzODQyNzA0MikNCg0KYmFzYWwgPC0gYygzLCAxMCwgMzAsIDEwMCwgMzAwLCAxMDAwKQ0KY29uc3VtZXIgPC0gYygzLCAxMCwgMzAsIDEwMCwgMzAwLCAxMDAwKSAqIDINCmV2ZW50cyA8LSAobWF4KGJhc2FsKSArIG1heChjb25zdW1lcikpICogMg0KcnVucyA8LSAxMDANCg0KbG9nQm9keVNpemUgPC0gYygtMiwgLTEsIC0xLCAxKSAjIE1vcnRvbiBhbmQgTGF3IDE5OTcgdmVyc2lvbi4NCnBhcmFtZXRlcnMgPC0gYygwLjAxLCAxMCwgMC41LCAwLjIsIDEwMCwgMC4xKQ0KDQojIE5lZWQgdG8gcmVydW4gc2VlZHNQcmVwIHRvIGdldCB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIHJpZ2h0IGZvciBzZWVkc1J1bg0Kc2VlZHNQcmVwIDwtIHJ1bmlmKDIgKiBsZW5ndGgoYmFzYWwpICogbGVuZ3RoKGNvbnN1bWVyKSkgKiAxRTgNCnNlZWRzUnVuIDwtIHJ1bmlmKHJ1bnMgKiBsZW5ndGgoYmFzYWwpICogbGVuZ3RoKGNvbnN1bWVyKSkgKiAxRTgNCmBgYA0KDQpgYGB7ciBvcmdhbmlzZVBhcmFtc30NCnBhcmFtRnJhbWUgPC0gd2l0aChsaXN0KA0KICBiID0gcmVwKGJhc2FsLCB0aW1lcyA9IGxlbmd0aChjb25zdW1lcikpLA0KICBjID0gcmVwKGNvbnN1bWVyLCBlYWNoID0gbGVuZ3RoKGJhc2FsKSksDQogIHMxID0gc2VlZHNQcmVwWzE6KGxlbmd0aChiYXNhbCkgKiBsZW5ndGgoY29uc3VtZXIpKV0sDQogIHMyID0gc2VlZHNQcmVwWw0KICAgIChsZW5ndGgoYmFzYWwpICogbGVuZ3RoKGNvbnN1bWVyKSArIDEpOigNCiAgICAgIDIgKiBsZW5ndGgoYmFzYWwpICogbGVuZ3RoKGNvbnN1bWVyKSkNCiAgXSwNCiAgc1IgPSBzZWVkc1J1bg0KKSwgew0KICB0ZW1wIDwtIGRhdGEuZnJhbWUoDQogICAgQ29tYm5OdW0gPSAwLA0KICAgIEJhc2FscyA9IGIsDQogICAgQ29uc3VtZXJzID0gYywNCiAgICBTZWVkUG9vbCA9IHMxLA0KICAgIFNlZWRNYXQgPSBzMiwNCiAgICBTZWVkUnVucyA9ICIiLA0KICAgIFNlZWRSdW5zTnVtID0gMCwNCiAgICBFbmRTdGF0ZXMgPSBJKHJlcChsaXN0KCIiKSwgbGVuZ3RoKGIpKSksDQogICAgRW5kU3RhdGVzTnVtID0gMCwNCiAgICBFbmRTdGF0ZVNpemVzID0gSShyZXAobGlzdCgiIiksIGxlbmd0aChiKSkpLA0KICAgIEVuZFN0YXRlU2l6ZXNOdW0gPSBOQSwNCiAgICBFbmRTdGF0ZUFzc2VtYmx5ID0gSShyZXAobGlzdCgiIiksIGxlbmd0aChiKSkpLA0KICAgIEVuZFN0YXRlQWJ1bmRhbmNlID0gSShyZXAobGlzdCgiIiksIGxlbmd0aChiKSkpLA0KICAgIERhdGFzZXQgPSAiMjAyMS0wNCIsDQogICAgRGF0YXNldElEID0gMSwNCiAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UNCiAgKQ0KICBmb3IgKGkgaW4gMTpucm93KHRlbXApKSB7DQogICAgc2VlZHMgPC0gc1JbKChpIC0gMSkgKiBydW5zICsgMSkgOiAoaSAqIHJ1bnMpXQ0KICAgIHRlbXAkU2VlZFJ1bnNbaV0gPC0gdG9TdHJpbmcoc2VlZHMpICMgQ1NWDQogICAgdGVtcCRTZWVkUnVuc051bVtpXSA8LSBsZW5ndGgoc2VlZHMpDQogIH0NCiAgdGVtcCRDb21ibk51bSA8LSAxOm5yb3codGVtcCkNCiAgdGVtcA0KfSkNCmBgYA0KDQpgYGB7ciBsb2FkUmVzdWx0c30NCiMgTm90ZTogbiArIDIgZW5kIHN0YXRlcy4gRmFpbHVyZSB0byBmaW5pc2gsIGZhaWx1cmUgdG8gb2J0YWluIHN0YXRlLCBhbmQgc3RhdGUuDQpmb3IgKGkgaW4gMTpucm93KHBhcmFtRnJhbWUpKSB7DQogIHJlc3VsdHNMaXN0IDwtIGxpc3QoDQogICAgIk5vIFJ1biIgPSAwLA0KICAgICJObyBTdGF0ZSIgPSAwDQogICkNCiAgcmVzdWx0c1NpemUgPC0gbGlzdCgNCiAgICAiMCIgPSAwDQogICkNCiAgcmVzdWx0c0Fzc2VtYmx5IDwtIGxpc3QoDQogICAgIk5vIFJ1biIgPSBkYXRhLmZyYW1lKCksDQogICAgIk5vIFN0YXRlIiA9IGRhdGEuZnJhbWUoKQ0KICApDQogIHNlZWRzIDwtIHVubGlzdChzdHJzcGxpdChwYXJhbUZyYW1lJFNlZWRSdW5zW2ldLCAnLCAnKSkNCiAgZm9yIChzZWVkIGluIHNlZWRzKSB7DQogICAgZmlsZU5hbWUgPC0gZmlsZS5wYXRoKA0KICAgICAgZGlyVmlraW5nUmVzdWx0c1twYXJhbUZyYW1lJERhdGFzZXRJRFtpXV0sDQogICAgICBzcHJpbnRmKHJlc3VsdEZvcm1hdCwgcGFyYW1GcmFtZSRDb21ibk51bVtpXSwgc2VlZCkNCiAgICApDQogICAgDQogICAgaWYgKGZpbGUuZXhpc3RzKGZpbGVOYW1lKSkgew0KICAgICAgdGVtcCA8LSBsb2FkKGZpbGVOYW1lKQ0KICAgICAgdGVtcCA8LSBldmFsKHBhcnNlKHRleHQgPSB0ZW1wKSkgIyBHZXQgb2JqZWN0cy4NCiAgICAgIA0KICAgICAgaWYgKGlzLmRhdGEuZnJhbWUodGVtcCkpIHsNCiAgICAgICAgY29tbXVuaXR5IDwtIHRvU3RyaW5nKA0KICAgICAgICAgIHRlbXBbW25jb2wodGVtcCldXVtbbnJvdyh0ZW1wKV1dDQogICAgICAgICkNCiAgICAgICAgc2l6ZSA8LSB0b1N0cmluZyhsZW5ndGgodGVtcFtbbmNvbCh0ZW1wKV1dW1tucm93KHRlbXApXV0pKQ0KICAgICAgICANCiAgICAgICAgaWYgKGNvbW11bml0eSA9PSAiIikgew0KICAgICAgICAgIHJlc3VsdHNMaXN0JGBObyBTdGF0ZWAgPC0gcmVzdWx0c0xpc3QkYE5vIFN0YXRlYCArIDENCiAgICAgICAgICByZXN1bHRzU2l6ZSRgMGAgPC0gcmVzdWx0c1NpemUkYDBgICsgMQ0KICAgICAgICAgIA0KICAgICAgICB9IGVsc2UgaWYgKGNvbW11bml0eSAlaW4lIG5hbWVzKHJlc3VsdHNMaXN0KSkgew0KICAgICAgICAgIHJlc3VsdHNMaXN0W1tjb21tdW5pdHldXSA8LSByZXN1bHRzTGlzdFtbY29tbXVuaXR5XV0gKyAxDQogICAgICAgICAgcmVzdWx0c1NpemVbW3NpemVdXSA8LSByZXN1bHRzU2l6ZVtbc2l6ZV1dICsgMQ0KICAgICAgICAgIA0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHJlc3VsdHNMaXN0W1tjb21tdW5pdHldXSA8LSAxDQogICAgICAgICAgcmVzdWx0c0Fzc2VtYmx5W1tjb21tdW5pdHldXSA8LSB0ZW1wDQogICAgICAgICAgDQogICAgICAgICAgaWYgKHNpemUgJWluJSByZXN1bHRzU2l6ZSkgew0KICAgICAgICAgICAgcmVzdWx0c1NpemVbW3NpemVdXSA8LSByZXN1bHRzU2l6ZVtbc2l6ZV1dICsgMQ0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZXN1bHRzU2l6ZVtbc2l6ZV1dIDwtIDENCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJlc3VsdHNMaXN0JGBObyBTdGF0ZWAgPC0gcmVzdWx0c0xpc3QkYE5vIFN0YXRlYCArIDENCiAgICAgICAgcmVzdWx0c1NpemUkYDBgIDwtIHJlc3VsdHNTaXplJGAwYCArIDENCiAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgcmVzdWx0c0xpc3QkYE5vIFJ1bmAgPC0gcmVzdWx0c0xpc3QkYE5vIFJ1bmAgKyAxDQogICAgICByZXN1bHRzU2l6ZSRgMGAgPC0gcmVzdWx0c1NpemUkYDBgICsgMQ0KICAgIH0NCiAgfQ0KICANCiAgcGFyYW1GcmFtZSRFbmRTdGF0ZXNbW2ldXSA8LSByZXN1bHRzTGlzdA0KICBwYXJhbUZyYW1lJEVuZFN0YXRlc051bVtpXSA8LSBsZW5ndGgocmVzdWx0c0xpc3QpIC0gMiAjICEgTm8gU3RhdGUsIE5vIFJ1bg0KICBwYXJhbUZyYW1lJEVuZFN0YXRlU2l6ZXNbW2ldXSA8LSByZXN1bHRzU2l6ZQ0KICBwYXJhbUZyYW1lJEVuZFN0YXRlU2l6ZXNOdW1baV0gPC0gbGVuZ3RoKHJlc3VsdHNTaXplKSAtIDEgIyAhIDANCiAgcGFyYW1GcmFtZSRFbmRTdGF0ZUFzc2VtYmx5W1tpXV0gPC0gcmVzdWx0c0Fzc2VtYmx5DQp9DQpgYGANCg0KIyMgMjAyMS0wNSBEYXRhDQpgYGB7ciBvcmdhbmlzZVBhcmFtczJ9DQpzb3VyY2UoDQogIGZpbGUucGF0aChnZXR3ZCgpLCANCiAgICAgICAgICAgICJMYXdNb3J0b24xOTk2LU51bWVyaWNhbFBvb2xDb21tdW5pdHlTY2FsaW5nLVNldHRpbmdzMi5SIikNCikNCg0Kb2xkTnJvdyA8LSBucm93KHBhcmFtRnJhbWUpDQoNCnBhcmFtRnJhbWUgPC0gcmJpbmQocGFyYW1GcmFtZSwgd2l0aChsaXN0KA0KICBiID0gcmVwKGJhc2FsLCB0aW1lcyA9IGxlbmd0aChjb25zdW1lcikpLA0KICBjID0gcmVwKGNvbnN1bWVyLCBlYWNoID0gbGVuZ3RoKGJhc2FsKSksDQogIHMxID0gc2VlZHNQcmVwWzE6KGxlbmd0aChiYXNhbCkgKiBsZW5ndGgoY29uc3VtZXIpKV0sDQogIHMyID0gc2VlZHNQcmVwWw0KICAgIChsZW5ndGgoYmFzYWwpICogbGVuZ3RoKGNvbnN1bWVyKSArIDEpOigNCiAgICAgIDIgKiBsZW5ndGgoYmFzYWwpICogbGVuZ3RoKGNvbnN1bWVyKSkNCiAgXSwNCiAgc1IgPSBzZWVkc1J1bg0KKSwgew0KICB0ZW1wIDwtIGRhdGEuZnJhbWUoDQogICAgQ29tYm5OdW0gPSAwLA0KICAgIEJhc2FscyA9IGIsDQogICAgQ29uc3VtZXJzID0gYywNCiAgICBTZWVkUG9vbCA9IHMxLA0KICAgIFNlZWRNYXQgPSBzMiwNCiAgICBTZWVkUnVucyA9ICIiLA0KICAgIFNlZWRSdW5zTnVtID0gMCwNCiAgICBFbmRTdGF0ZXMgPSBJKHJlcChsaXN0KCIiKSwgbGVuZ3RoKGIpKSksDQogICAgRW5kU3RhdGVzTnVtID0gMCwNCiAgICBFbmRTdGF0ZVNpemVzID0gSShyZXAobGlzdCgiIiksIGxlbmd0aChiKSkpLA0KICAgIEVuZFN0YXRlU2l6ZXNOdW0gPSBOQSwNCiAgICBFbmRTdGF0ZUFzc2VtYmx5ID0gSShyZXAobGlzdCgiIiksIGxlbmd0aChiKSkpLA0KICAgIEVuZFN0YXRlQWJ1bmRhbmNlID0gSShyZXAobGlzdCgiIiksIGxlbmd0aChiKSkpLA0KICAgIERhdGFzZXQgPSAiMjAyMS0wNSIsDQogICAgRGF0YXNldElEID0gMiwNCiAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UNCiAgKQ0KICBmb3IgKGkgaW4gMTpucm93KHRlbXApKSB7DQogICAgc2VlZHMgPC0gc1JbKChpIC0gMSkgKiBydW5zICsgMSkgOiAoaSAqIHJ1bnMpXQ0KICAgIHRlbXAkU2VlZFJ1bnNbaV0gPC0gdG9TdHJpbmcoc2VlZHMpICMgQ1NWDQogICAgdGVtcCRTZWVkUnVuc051bVtpXSA8LSBsZW5ndGgoc2VlZHMpDQogIH0NCiAgdGVtcCRDb21ibk51bSA8LSAxOm5yb3codGVtcCkNCiAgdGVtcA0KfSkNCikNCmBgYA0KDQpgYGB7ciBsb2FkUmVzdWx0czJ9DQojIE5vdGU6IG4gKyAyIGVuZCBzdGF0ZXMuIEZhaWx1cmUgdG8gZmluaXNoLCBmYWlsdXJlIHRvIG9idGFpbiBzdGF0ZSwgYW5kIHN0YXRlLg0KIyBNb2RpZmllZCBmcm9tIGFib3ZlLCBidXQgd2l0aCB0aGUgYWJ1bmRhbmNlIHJlY29yZGVkLg0KZm9yIChpIGluIChvbGROcm93ICsgMSk6bnJvdyhwYXJhbUZyYW1lKSkgew0KICByZXN1bHRzTGlzdCA8LSBsaXN0KA0KICAgICJObyBSdW4iID0gMCwNCiAgICAiTm8gU3RhdGUiID0gMA0KICApDQogIHJlc3VsdHNTaXplIDwtIGxpc3QoDQogICAgIjAiID0gMA0KICApDQogIHJlc3VsdHNBc3NlbWJseSA8LSBsaXN0KA0KICAgICJObyBSdW4iID0gZGF0YS5mcmFtZSgpLA0KICAgICJObyBTdGF0ZSIgPSBkYXRhLmZyYW1lKCkNCiAgKQ0KICByZXN1bHRzQWJ1bmQgPC0gbGlzdCgNCiAgICAiTm8gUnVuIiA9ICIiLA0KICAgICJObyBTdGF0ZSIgPSAiIg0KICApDQogIHNlZWRzIDwtIHVubGlzdChzdHJzcGxpdChwYXJhbUZyYW1lJFNlZWRSdW5zW2ldLCAnLCAnKSkNCiAgZm9yIChzZWVkIGluIHNlZWRzKSB7DQogICAgZmlsZU5hbWUgPC0gZmlsZS5wYXRoKA0KICAgICAgZGlyVmlraW5nUmVzdWx0c1twYXJhbUZyYW1lJERhdGFzZXRJRFtpXV0sDQogICAgICBzcHJpbnRmKHJlc3VsdEZvcm1hdCwgcGFyYW1GcmFtZSRDb21ibk51bVtpXSwgc2VlZCkNCiAgICApDQogICAgDQogICAgaWYgKGZpbGUuZXhpc3RzKGZpbGVOYW1lKSkgew0KICAgICAgdGVtcCA8LSBsb2FkKGZpbGVOYW1lKQ0KICAgICAgdGVtcCA8LSBldmFsKHBhcnNlKHRleHQgPSB0ZW1wKSkgIyBHZXQgb2JqZWN0cy4NCiAgICAgIA0KICAgICAgaWYgKGlzLmxpc3QodGVtcCkgJiYgIlJlc3VsdCIgJWluJSBuYW1lcyh0ZW1wKSkgew0KICAgICAgICANCiAgICAgICAgaWYgKGlzLmRhdGEuZnJhbWUodGVtcCRSZXN1bHQpKQ0KICAgICAgICAgIGNvbW11bml0eSA8LSB0ZW1wJFJlc3VsdCRDb21tdW5pdHlbW25yb3codGVtcCRSZXN1bHQpXV0NCiAgICAgICAgZWxzZSANCiAgICAgICAgICBjb21tdW5pdHkgPC0gdGVtcCRSZXN1bHQNCiAgICAgICAgDQogICAgICAgIHNpemUgPC0gdG9TdHJpbmcobGVuZ3RoKGNvbW11bml0eSkpDQogICAgICAgIA0KICAgICAgICBpZiAoY29tbXVuaXR5WzFdICE9ICIiKSANCiAgICAgICAgICBhYnVuZCA8LSB0b1N0cmluZyh0ZW1wJEFidW5kW2NvbW11bml0eSArIDFdKQ0KICAgICAgICBlbHNlIA0KICAgICAgICAgIGFidW5kIDwtICIiDQogICAgICAgIA0KICAgICAgICBjb21tdW5pdHkgPC0gdG9TdHJpbmcoY29tbXVuaXR5KQ0KICAgICAgICANCiAgICAgICAgaWYgKGNvbW11bml0eSA9PSAiIikgew0KICAgICAgICAgIHJlc3VsdHNMaXN0JGBObyBTdGF0ZWAgPC0gcmVzdWx0c0xpc3QkYE5vIFN0YXRlYCArIDENCiAgICAgICAgICByZXN1bHRzU2l6ZSRgMGAgPC0gcmVzdWx0c1NpemUkYDBgICsgMQ0KICAgICAgICAgIA0KICAgICAgICB9IGVsc2UgaWYgKGNvbW11bml0eSAlaW4lIG5hbWVzKHJlc3VsdHNMaXN0KSkgew0KICAgICAgICAgIHJlc3VsdHNMaXN0W1tjb21tdW5pdHldXSA8LSByZXN1bHRzTGlzdFtbY29tbXVuaXR5XV0gKyAxDQogICAgICAgICAgcmVzdWx0c1NpemVbW3NpemVdXSA8LSByZXN1bHRzU2l6ZVtbc2l6ZV1dICsgMQ0KICAgICAgICAgIA0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHJlc3VsdHNMaXN0W1tjb21tdW5pdHldXSA8LSAxDQogICAgICAgICAgcmVzdWx0c0Fzc2VtYmx5W1tjb21tdW5pdHldXSA8LSB0ZW1wDQogICAgICAgICAgcmVzdWx0c0FidW5kW1tjb21tdW5pdHldXSA8LSBhYnVuZA0KICAgICAgICAgIA0KICAgICAgICAgIGlmIChzaXplICVpbiUgcmVzdWx0c1NpemUpIHsNCiAgICAgICAgICAgIHJlc3VsdHNTaXplW1tzaXplXV0gPC0gcmVzdWx0c1NpemVbW3NpemVdXSArIDENCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmVzdWx0c1NpemVbW3NpemVdXSA8LSAxDQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXN1bHRzTGlzdCRgTm8gU3RhdGVgIDwtIHJlc3VsdHNMaXN0JGBObyBTdGF0ZWAgKyAxDQogICAgICAgIHJlc3VsdHNTaXplJGAwYCA8LSByZXN1bHRzU2l6ZSRgMGAgKyAxDQogICAgICB9DQogICAgfSBlbHNlIHsNCiAgICAgIHJlc3VsdHNMaXN0JGBObyBSdW5gIDwtIHJlc3VsdHNMaXN0JGBObyBSdW5gICsgMQ0KICAgICAgcmVzdWx0c1NpemUkYDBgIDwtIHJlc3VsdHNTaXplJGAwYCArIDENCiAgICB9DQogIH0NCiAgDQogIHBhcmFtRnJhbWUkRW5kU3RhdGVzW1tpXV0gPC0gcmVzdWx0c0xpc3QNCiAgcGFyYW1GcmFtZSRFbmRTdGF0ZXNOdW1baV0gPC0gbGVuZ3RoKHJlc3VsdHNMaXN0KSAtIDIgIyAhIE5vIFN0YXRlLCBObyBSdW4NCiAgcGFyYW1GcmFtZSRFbmRTdGF0ZVNpemVzW1tpXV0gPC0gcmVzdWx0c1NpemUNCiAgcGFyYW1GcmFtZSRFbmRTdGF0ZVNpemVzTnVtW2ldIDwtIGxlbmd0aChyZXN1bHRzU2l6ZSkgLSAxICMgISAwDQogIHBhcmFtRnJhbWUkRW5kU3RhdGVBc3NlbWJseVtbaV1dIDwtIHJlc3VsdHNBc3NlbWJseQ0KICBwYXJhbUZyYW1lJEVuZFN0YXRlQWJ1bmRhbmNlW1tpXV0gPC0gcmVzdWx0c0FidW5kDQp9DQpgYGANCg0KIyMgUGxvdA0KDQpgYGB7ciBwbG90M0R9DQojIFgsIFksIEJhc2FsIGFuZCBDb25zdW1lci4NCiMgWiA9IFNpemVzIG9mIHRoZSBFbmRzdGF0ZXMuDQoNCnBsb3RTY2FsaW5nRGF0YSA8LSBkYXRhLmZyYW1lKA0KICBDb21ibk51bSA9IHJlcChwYXJhbUZyYW1lJENvbWJuTnVtLCBwYXJhbUZyYW1lJEVuZFN0YXRlc051bSksDQogIEJhc2FscyA9IHJlcChwYXJhbUZyYW1lJEJhc2FscywgcGFyYW1GcmFtZSRFbmRTdGF0ZXNOdW0pLA0KICBDb25zdW1lcnMgPSByZXAocGFyYW1GcmFtZSRDb25zdW1lcnMsIHBhcmFtRnJhbWUkRW5kU3RhdGVzTnVtKSwNCiAgRGF0YXNldCA9IHJlcChwYXJhbUZyYW1lJERhdGFzZXQsIHBhcmFtRnJhbWUkRW5kU3RhdGVzTnVtKSwNCiAgRGF0YXNldElEID0gcmVwKHBhcmFtRnJhbWUkRGF0YXNldElELCBwYXJhbUZyYW1lJEVuZFN0YXRlc051bSkNCikNCg0KIyBDb21tdW5pdGllcw0KY29tbXMgPC0gdW5saXN0KGxhcHBseShwYXJhbUZyYW1lJEVuZFN0YXRlcywgbmFtZXMpKQ0KZnJlcXMgPC0gdW5saXN0KHBhcmFtRnJhbWUkRW5kU3RhdGVzKQ0KYXNtYmwgPC0gdW5saXN0KHBhcmFtRnJhbWUkRW5kU3RhdGVBc3NlbWJseSwgcmVjdXJzaXZlID0gRkFMU0UpDQphc21ibCA8LSBhc21ibFtjb21tcyAhPSAiTm8gUnVuIiAmIGNvbW1zICE9ICJObyBTdGF0ZSJdDQpmcmVxcyA8LSBmcmVxc1tjb21tcyAhPSAiTm8gUnVuIiAmIGNvbW1zICE9ICJObyBTdGF0ZSJdDQpjb21tcyA8LSBjb21tc1tjb21tcyAhPSAiTm8gUnVuIiAmIGNvbW1zICE9ICJObyBTdGF0ZSJdDQoNCmFzbWJsIDwtIGxhcHBseShhc21ibCwgZnVuY3Rpb24oZCkgew0KICBpZiAoIlJlc3VsdC5PdXRjb21lIiAlaW4lIG5hbWVzKGQpKQ0KICAgIGQgJT4lIGRwbHlyOjpmaWx0ZXIoUmVzdWx0Lk91dGNvbWUgIT0gIlR5cGUgMSAoRmFpbHVyZSkiICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdC5PdXRjb21lICE9ICJQcmVzZW50IikNCiAgZWxzZQ0KICAgIGQkUmVzdWx0ICU+JSBkcGx5cjo6ZmlsdGVyKE91dGNvbWUgIT0gIlR5cGUgMSAoRmFpbHVyZSkiICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRjb21lICE9ICJQcmVzZW50IikNCn0pDQoNCnBsb3RTY2FsaW5nRGF0YSRDb21tdW5pdGllcyA8LSBjb21tcw0KcGxvdFNjYWxpbmdEYXRhJENvbW11bml0eUZyZXEgPC0gZnJlcXMNCnBsb3RTY2FsaW5nRGF0YSRDb21tdW5pdHlTZXEgPC0gYXNtYmwNCg0KIyBDb21tdW5pdHkgU2l6ZQ0KdGVtcCA8LSB1bmxpc3QobGFwcGx5KHN0cnNwbGl0KHBsb3RTY2FsaW5nRGF0YSRDb21tdW5pdGllcywgJywnKSwgbGVuZ3RoKSkNCnBsb3RTY2FsaW5nRGF0YSRDb21tdW5pdHlTaXplIDwtIHRlbXANCg0KIyBGb3IgdXNhZ2UgYnkgdGhlIHJlYWRlci4NCg0KcGxvdFNjYWxpbmcgPC0gcGxvdGx5OjpwbG90X2x5KA0KICBwbG90U2NhbGluZ0RhdGEsDQogIHggPSB+QmFzYWxzLA0KICB5ID0gfkNvbnN1bWVycywNCiAgeiA9IH5Db21tdW5pdHlTaXplLA0KICBjb2xvciA9IH5EYXRhc2V0DQopDQoNCnBsb3RTY2FsaW5nIDwtIHBsb3RseTo6YWRkX21hcmtlcnMocGxvdFNjYWxpbmcpDQoNCnBsb3RTY2FsaW5nIDwtIHBsb3RseTo6bGF5b3V0KA0KICBwbG90U2NhbGluZywNCiAgc2NlbmUgPSBsaXN0KA0KICAgIHhheGlzID0gbGlzdCh0eXBlID0gImxvZyIpLA0KICAgIHlheGlzID0gbGlzdCh0eXBlID0gImxvZyIpDQogICkNCikNCg0KcGxvdFNjYWxpbmcNCmBgYA0KYGBge3IgcGxvdDNkRGF0YX0NCnBsb3RTY2FsaW5nRGF0YSAlPiUgZHBseXI6OnNlbGVjdCgtQ29tbXVuaXR5U2VxKQ0KYGBgDQojIyBXaGF0IGhhcHBlbnMgaWYgd2UgdHJ5IHRvIHBsb3QgYSBwbGFuZT8NCg0KQ2hlY2sgd2l0aCBkYXRhc2V0IGFzIGEgcGFydCBvZiB0aGUgbW9kZWwuIA0KKFRoZXkgc2hvdWxkIG5vdCBiZSwgYXMgdGhleSBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBzYW1lIGNvZGUsIGJ1dCBkaWZmZXJlbnQgc2VlZHMuKQ0KDQpgYGB7ciBsaW5lYXJtb2RlbDF9DQpwbG90U2FtcGxpbmdEYXRhTE0xIDwtIGxtKA0KICBsb2coQ29tbXVuaXR5U2l6ZSkgfiBsb2coQmFzYWxzKSArIGxvZyhDb25zdW1lcnMpICsgRGF0YXNldCwgDQogIGRhdGEgPSBwbG90U2NhbGluZ0RhdGENCikNCnN1bW1hcnkocGxvdFNhbXBsaW5nRGF0YUxNMSkNCmBgYA0KDQpEYXRhc2V0cyBkbyBub3QgbG9vayB0byBoYXZlIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBlZmZlY3QuDQpXaXRob3V0IGNvbXBhcmluZyB0aGUgbW9kZWxzICh3b3VsZCBuZWVkIHRvIGRvIGluIGFueSBwdWJsaWNhdGlvbiksIHRoZSBtb2RlbA0Kd2l0aG91dCB0aGUgZGF0YXNldCBlZmZlY3QgaXM6DQoNCmBgYHtyIGxpbmVhcm1vZGVsMn0NCnBsb3RTYW1wbGluZ0RhdGFMTTIgPC0gbG0oDQogIGxvZyhDb21tdW5pdHlTaXplKSB+IGxvZyhCYXNhbHMpICsgbG9nKENvbnN1bWVycyksIA0KICBkYXRhID0gcGxvdFNjYWxpbmdEYXRhDQopDQpzdW1tYXJ5KHBsb3RTYW1wbGluZ0RhdGFMTTIpDQpgYGANCg0KQWRkaW5nIHRoaXMgdG8gdGhlIHBsb3Q6DQpgYGB7ciBwbG90bHlMTTJ9DQojIEUuZy4gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM4NTMzMDQ2DQpwbG90U2FtcGxpbmdEYXRhTE0yUmVzIDwtIDMNCnBsb3RTYW1wbGluZ0RhdGFMTTJBeGlzWCA8LSBzb3J0KHVuaXF1ZShwbG90U2NhbGluZ0RhdGEkQmFzYWxzKSkNCiAgIyBzZXEobWluKHBsb3RTY2FsaW5nRGF0YSRCYXNhbHMpLCANCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgocGxvdFNjYWxpbmdEYXRhJEJhc2FscyksDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBwbG90U2FtcGxpbmdEYXRhTE0yUmVzKSANCnBsb3RTYW1wbGluZ0RhdGFMTTJBeGlzWSA8LSBzb3J0KHVuaXF1ZShwbG90U2NhbGluZ0RhdGEkQ29uc3VtZXJzKSkNCiMgc2VxKG1pbihwbG90U2NhbGluZ0RhdGEkQ29uc3VtZXJzKSwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsb3RTY2FsaW5nRGF0YSRDb25zdW1lcnMpLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gcGxvdFNhbXBsaW5nRGF0YUxNMlJlcykgDQpwbG90U2FtcGxpbmdEYXRhTE0yU3VyZiA8LSBleHBhbmQuZ3JpZCgNCiAgQmFzYWxzID0gcGxvdFNhbXBsaW5nRGF0YUxNMkF4aXNYLA0KICBDb25zdW1lcnMgPSBwbG90U2FtcGxpbmdEYXRhTE0yQXhpc1kNCikgDQpwbG90U2FtcGxpbmdEYXRhTE0yU3VyZiRDb21tdW5pdHlTaXplIDwtIGV4cChwcmVkaWN0LmxtKA0KICBwbG90U2FtcGxpbmdEYXRhTE0yLCBuZXdkYXRhID0gcGxvdFNhbXBsaW5nRGF0YUxNMlN1cmYNCikpDQpwbG90U2FtcGxpbmdEYXRhTE0yU3VyZiA8LSByZXNoYXBlMjo6YWNhc3QoICMgQ2FzdCB0byBhcnJheS9tYXRyaXgNCiAgcGxvdFNhbXBsaW5nRGF0YUxNMlN1cmYsIEJhc2FscyB+IENvbnN1bWVycywgdmFsdWUudmFyID0gIkNvbW11bml0eVNpemUiDQopDQoNCnBsb3RTY2FsaW5nICU+JSBwbG90bHk6OmFkZF90cmFjZSh6ID0gcGxvdFNhbXBsaW5nRGF0YUxNMlN1cmYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHBsb3RTYW1wbGluZ0RhdGFMTTJBeGlzWCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gcGxvdFNhbXBsaW5nRGF0YUxNMkF4aXNZLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAic3VyZmFjZSIpDQpgYGANCg0KTm90IHBhcnRpY3VsYXJseSBjb252aW5jaW5nLCBidXQgaXQgZG9lcyBhZ3JlZSB3aXRoIGdlbmVyYWwgaWRlYXMgKGNvbnN1bWVycyBsZXNzIGltcG9ydGFudCB0aGFuIGJhc2FscykuDQoNCmBgYHtyIGxpbmVhcm1vZGVsM30NCnBsb3RTYW1wbGluZ0RhdGFMTTMgPC0gbG0oDQogIGxvZyhDb21tdW5pdHlTaXplKSB+IGxvZyhCYXNhbHMpICsgbG9nKENvbnN1bWVycykgLSAxLCANCiAgZGF0YSA9IHBsb3RTY2FsaW5nRGF0YQ0KKQ0Kc3VtbWFyeShwbG90U2FtcGxpbmdEYXRhTE0zKQ0KYGBgDQoNCmBgYHtyIHBsb3RseUxNM30NCiMgRS5nLiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzg1MzMwNDYNCnBsb3RTYW1wbGluZ0RhdGFMTTNSZXMgPC0gMw0KcGxvdFNhbXBsaW5nRGF0YUxNM0F4aXNYIDwtIHNvcnQodW5pcXVlKHBsb3RTY2FsaW5nRGF0YSRCYXNhbHMpKQ0KICAjIHNlcShtaW4ocGxvdFNjYWxpbmdEYXRhJEJhc2FscyksIA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbG90U2NhbGluZ0RhdGEkQmFzYWxzKSwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IHBsb3RTYW1wbGluZ0RhdGFMTTJSZXMpIA0KcGxvdFNhbXBsaW5nRGF0YUxNM0F4aXNZIDwtIHNvcnQodW5pcXVlKHBsb3RTY2FsaW5nRGF0YSRDb25zdW1lcnMpKQ0KIyBzZXEobWluKHBsb3RTY2FsaW5nRGF0YSRDb25zdW1lcnMpLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgocGxvdFNjYWxpbmdEYXRhJENvbnN1bWVycyksDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBwbG90U2FtcGxpbmdEYXRhTE0yUmVzKSANCnBsb3RTYW1wbGluZ0RhdGFMTTNTdXJmIDwtIGV4cGFuZC5ncmlkKA0KICBCYXNhbHMgPSBwbG90U2FtcGxpbmdEYXRhTE0zQXhpc1gsDQogIENvbnN1bWVycyA9IHBsb3RTYW1wbGluZ0RhdGFMTTNBeGlzWQ0KKSANCnBsb3RTYW1wbGluZ0RhdGFMTTNTdXJmJENvbW11bml0eVNpemUgPC0gZXhwKHByZWRpY3QubG0oDQogIHBsb3RTYW1wbGluZ0RhdGFMTTMsIG5ld2RhdGEgPSBwbG90U2FtcGxpbmdEYXRhTE0zU3VyZg0KKSkNCnBsb3RTYW1wbGluZ0RhdGFMTTNTdXJmIDwtIHJlc2hhcGUyOjphY2FzdCggIyBDYXN0IHRvIGFycmF5L21hdHJpeA0KICBwbG90U2FtcGxpbmdEYXRhTE0zU3VyZiwgQmFzYWxzIH4gQ29uc3VtZXJzLCB2YWx1ZS52YXIgPSAiQ29tbXVuaXR5U2l6ZSINCikNCg0KcGxvdFNjYWxpbmcgJT4lIHBsb3RseTo6YWRkX3RyYWNlKHogPSBwbG90U2FtcGxpbmdEYXRhTE0zU3VyZiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gcGxvdFNhbXBsaW5nRGF0YUxNM0F4aXNYLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBwbG90U2FtcGxpbmdEYXRhTE0zQXhpc1ksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJzdXJmYWNlIikNCmBgYA0KDQpgYGB7ciBsaW5lYXJtb2RlbDR9DQpwbG90U2FtcGxpbmdEYXRhTE00IDwtIGxtKA0KICBDb21tdW5pdHlTaXplIH4gbG9nKEJhc2FscykgKyBsb2coQ29uc3VtZXJzKSwgDQogIGRhdGEgPSBwbG90U2NhbGluZ0RhdGENCikNCnN1bW1hcnkocGxvdFNhbXBsaW5nRGF0YUxNNCkNCmBgYA0KDQpgYGB7ciBwbG90bHlMTTR9DQojIEUuZy4gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM4NTMzMDQ2DQpwbG90U2FtcGxpbmdEYXRhTE00UmVzIDwtIDMNCnBsb3RTYW1wbGluZ0RhdGFMTTRBeGlzWCA8LSBzb3J0KHVuaXF1ZShwbG90U2NhbGluZ0RhdGEkQmFzYWxzKSkNCiAgIyBzZXEobWluKHBsb3RTY2FsaW5nRGF0YSRCYXNhbHMpLCANCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgocGxvdFNjYWxpbmdEYXRhJEJhc2FscyksDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBwbG90U2FtcGxpbmdEYXRhTE0yUmVzKSANCnBsb3RTYW1wbGluZ0RhdGFMTTRBeGlzWSA8LSBzb3J0KHVuaXF1ZShwbG90U2NhbGluZ0RhdGEkQ29uc3VtZXJzKSkNCiMgc2VxKG1pbihwbG90U2NhbGluZ0RhdGEkQ29uc3VtZXJzKSwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsb3RTY2FsaW5nRGF0YSRDb25zdW1lcnMpLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gcGxvdFNhbXBsaW5nRGF0YUxNMlJlcykgDQpwbG90U2FtcGxpbmdEYXRhTE00U3VyZiA8LSBleHBhbmQuZ3JpZCgNCiAgQmFzYWxzID0gcGxvdFNhbXBsaW5nRGF0YUxNM0F4aXNYLA0KICBDb25zdW1lcnMgPSBwbG90U2FtcGxpbmdEYXRhTE0zQXhpc1kNCikgDQpwbG90U2FtcGxpbmdEYXRhTE00U3VyZiRDb21tdW5pdHlTaXplIDwtIGV4cChwcmVkaWN0LmxtKA0KICBwbG90U2FtcGxpbmdEYXRhTE00LCBuZXdkYXRhID0gcGxvdFNhbXBsaW5nRGF0YUxNNFN1cmYNCikpDQpwbG90U2FtcGxpbmdEYXRhTE00U3VyZiA8LSByZXNoYXBlMjo6YWNhc3QoICMgQ2FzdCB0byBhcnJheS9tYXRyaXgNCiAgcGxvdFNhbXBsaW5nRGF0YUxNNFN1cmYsIEJhc2FscyB+IENvbnN1bWVycywgdmFsdWUudmFyID0gIkNvbW11bml0eVNpemUiDQopDQoNCnBsb3RTY2FsaW5nICU+JSBwbG90bHk6OmFkZF90cmFjZSh6ID0gcGxvdFNhbXBsaW5nRGF0YUxNNFN1cmYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHBsb3RTYW1wbGluZ0RhdGFMTTRBeGlzWCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gcGxvdFNhbXBsaW5nRGF0YUxNNEF4aXNZLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAic3VyZmFjZSIpDQpgYGANCg0KIyBIb3cgZG8gdGhleSBpbnRlcmFjdCB3aXRoIGVhY2ggb3RoZXIgKG9uIGlzbGFuZHMpPw0KDQpgYGB7ciBsb2FkUG9vbHNNYXRzfQ0KIyA+IHJ1bmlmKDEpICogMUU4DQojIFsxXSA4MjU5ODY3OQ0Kc2V0LnNlZWQoODI1OTg2NzkpDQoNCm1hdHMgPC0gbGlzdCgpDQpwb29sc2FsbCA8LSBsaXN0KCkgIyBuYW1lIHBvb2xzIHVzZWQgaW4gc2F2ZSBkYXRhOyBiZSBjYXJlZnVsIQ0KDQpmb3IgKGkgaW4gMTpsZW5ndGgoZGlyVmlraW5nKSkgew0KICB0ZW1wIDwtIGxvYWQoZmlsZS5wYXRoKA0KICAgIGRpclZpa2luZ1tpXSwgDQogICAgcGFzdGUwKCJMYXdNb3J0b24xOTk2LU51bWVyaWNhbFBvb2xDb21tdW5pdHlTY2FsaW5nLVBvb2xNYXRzIiwgDQogICAgICAgICAgIGlmIChpID4gMSkgaSBlbHNlICIiLCANCiAgICAgICAgICAgIi5SRFMiKQ0KICApKQ0KICBtYXRzW1tpXV0gPC0gZXZhbChwYXJzZSh0ZXh0ID0gdGVtcFsxXSkpDQogIHBvb2xzYWxsW1tpXV0gPC0gZXZhbChwYXJzZSh0ZXh0ID0gdGVtcFsyXSkpDQp9DQpwb29scyA8LSBwb29sc2FsbA0KDQpvbGRDYW5kaWRhdGVEYXRhIDwtIGxvYWQoZmlsZS5wYXRoKGdldHdkKCksICJjYW5kaWRhdGVEYXRhU29GYXIuUmRhdGEiKSkNCm9sZENhbmRpZGF0ZURhdGEgPC0gZXZhbChwYXJzZSh0ZXh0ID0gb2xkQ2FuZGlkYXRlRGF0YSkpDQpgYGANCg0KYGBge3IgY29tcHV0ZUNhbmRpZGF0ZXN9DQpjYW5kaWRhdGVEYXRhIDwtIHBsb3RTY2FsaW5nRGF0YSAlPiUgZHBseXI6Omdyb3VwX2J5KA0KICBDb21ibk51bSwgRGF0YXNldA0KKSAlPiUgZHBseXI6Om11dGF0ZSgNCiAgT3RoZXJTdGVhZHlTdGF0ZXMgPSBkcGx5cjo6bigpIC0gMQ0KKSAlPiUgZHBseXI6OmZpbHRlcigNCiAgT3RoZXJTdGVhZHlTdGF0ZXMgPiAwDQopDQpjYW5kaWRhdGVEYXRhICU+JSBkcGx5cjo6c2VsZWN0KC1Db21tdW5pdHlTZXEpDQpgYGANCg0KYGBge3IgbG9hZEFidW5kYW5jZXN9DQojIEZpcnN0LCBjaGVjayBpZiBpdCBpcyBpbiB0aGUgcGFyYW1GcmFtZS4NCiMgU2Vjb25kLCBjaGVjayBpZiBpdCBpcyBpbiB0aGUgc2F2ZWQgZGF0YSBmcm9tIHRoZSBwcmV2aW91cy4NCiMgT3RoZXJ3aXNlLCBpZ25vcmUgaXQsIHdlJ2xsIGZpZ3VyZSBvdXQgd2hhdCBpdCBpcyBhbmQgd2h5IGl0IGlzIG1pc3NpbmcgbGF0ZXIuDQoNCmNhbmRpZGF0ZURhdGEkQ29tbXVuaXR5QWJ1bmQgPC0gIiINCg0KZm9yIChyIGluIDE6bnJvdyhjYW5kaWRhdGVEYXRhKSkgew0KICAjIElEIDE6NCBhcmUgdXNlZCB0byBpZGVudGlmeSBwYXJhbUZyYW1lLCA1IHVzZWQgdG8gaWRlbnRpZnkgYWJ1bmRhbmNlDQogIElEIDwtIGNhbmRpZGF0ZURhdGFbciwgMTo2XQ0KICBwYXJhbUZyYW1lUm93IDwtIHBhcmFtRnJhbWUgJT4lIGRwbHlyOjpmaWx0ZXIoDQogICAgQ29tYm5OdW0gPT0gSUQkQ29tYm5OdW0sDQogICAgQmFzYWxzID09IElEJEJhc2FscywNCiAgICBDb25zdW1lcnMgPT0gSUQkQ29uc3VtZXJzLA0KICAgIERhdGFzZXQgPT0gSUQkRGF0YXNldA0KICApDQogIA0KICBpZiAoaXMubGlzdChwYXJhbUZyYW1lUm93JEVuZFN0YXRlQWJ1bmRhbmNlW1sxXV0pKSB7DQogICAgZW50cnkgPC0gd2hpY2goSUQkQ29tbXVuaXRpZXMgPT0gbmFtZXMocGFyYW1GcmFtZVJvdyRFbmRTdGF0ZUFidW5kYW5jZVtbMV1dKSkNCiAgICBpZiAobGVuZ3RoKGVudHJ5KSkgew0KICAgICAgY2FuZGlkYXRlRGF0YSRDb21tdW5pdHlBYnVuZFtyXSA8LSBwYXJhbUZyYW1lUm93JEVuZFN0YXRlQWJ1bmRhbmNlW1sxXV1bW2VudHJ5XV0NCiAgICAgIG5leHQoKQ0KICAgIH0NCiAgfQ0KICANCiAgaWYgKElEJERhdGFzZXQgPT0gIjIwMjEtMDQiKSB7DQogICAgDQogICAgb2xkQ2FuZERhdFJvdyA8LSBvbGRDYW5kaWRhdGVEYXRhICU+JSBkcGx5cjo6ZmlsdGVyKA0KICAgICAgQ29tYm5OdW0gPT0gSUQkQ29tYm5OdW0sDQogICAgICBCYXNhbHMgPT0gSUQkQmFzYWxzLA0KICAgICAgQ29uc3VtZXJzID09IElEJENvbnN1bWVycywNCiAgICAgIENvbW11bml0aWVzID09IElEJENvbW11bml0aWVzDQogICAgKQ0KICAgIA0KICAgIGlmIChucm93KG9sZENhbmREYXRSb3cpID4gMCkgew0KICAgICAgaWYgKG9sZENhbmREYXRSb3ckQ29tbXVuaXR5QWJ1bmQgIT0gIiIpIHsNCiAgICAgICAgY2FuZGlkYXRlRGF0YSRDb21tdW5pdHlBYnVuZFtyXSA8LSBvbGRDYW5kRGF0Um93JENvbW11bml0eUFidW5kDQogICAgICB9DQogICAgfQ0KICB9DQp9DQpgYGANCg0KYGBge3IgZmlsdGVyTm9BYnVuZH0NCmNhbmRpZGF0ZURhdGEgPC0gY2FuZGlkYXRlRGF0YSAlPiUgZHBseXI6OmZpbHRlcihDb21tdW5pdHlBYnVuZCAhPSAiIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tdW5pdHlBYnVuZCAhPSAiRmFpbHVyZSIpDQpgYGANCg0KYGBge3IgY29tcHV0ZVByb2R1Y3Rpdml0eX0NCmNhbmRpZGF0ZURhdGEkQ29tbXVuaXR5UHJvZCA8LSBOQQ0KZm9yIChyIGluIDE6bnJvdyhjYW5kaWRhdGVEYXRhKSkgew0KICBjYW5kaWRhdGVEYXRhJENvbW11bml0eVByb2Rbcl0gPC0gd2l0aCgNCiAgICBjYW5kaWRhdGVEYXRhW3IsIF0sIA0KICAgIFJNVFJDb2RlMjo6UHJvZHVjdGl2aXR5KA0KICAgICAgUG9vbCA9IHBvb2xzW1tEYXRhc2V0SURdXVtbQ29tYm5OdW1dXSwgDQogICAgICBJbnRlcmFjdGlvbk1hdHJpeCA9IG1hdHNbW0RhdGFzZXRJRF1dW1tDb21ibk51bV1dLCANCiAgICAgIENvbW11bml0eSA9IENvbW11bml0aWVzLCANCiAgICAgIFBvcHVsYXRpb25zID0gQ29tbXVuaXR5QWJ1bmQNCiAgICApDQogICkNCn0NCmBgYA0KDQpgYGB7ciBpc2xhbmRGVU59DQppc2xhbmRGVU4gPC0gZnVuY3Rpb24oaSwgZGF0LCBwb29sLCBtYXQsIGRtYXQpIHsNCiAgdGVtcCA8LSBkYXRbaSwgXQ0KICBSTVRSQ29kZTI6OklzbGFuZER5bmFtaWNzKA0KICAgIFBvb2wgPSBwb29sLA0KICAgIEludGVyYWN0aW9uTWF0cml4ID0gbWF0LA0KICAgIENvbW11bml0aWVzID0gYygNCiAgICAgIGxpc3QodGVtcCRDb21tdW5pdGllc1sxXSksDQogICAgICByZXAoIiIsIG5yb3coZG1hdCkgLSAyKSwNCiAgICAgIHRlbXAkQ29tbXVuaXRpZXNbMl0NCiAgICApLA0KICAgIFBvcHVsYXRpb25zID0gYygNCiAgICAgIGxpc3QodGVtcCRDb21tdW5pdHlBYnVuZFsxXSksDQogICAgICByZXAoIiIsIG5yb3coZG1hdCkgLSAyKSwNCiAgICAgIGxpc3QodGVtcCRDb21tdW5pdHlBYnVuZFsyXSkNCiAgICApLA0KICAgIERpc3BlcnNhbFBvb2wgPSAwLjAwMDEsDQogICAgRGlzcGVyc2FsSXNsYW5kID0gZG1hdCwNCiAgKQ0KfQ0KYGBgDQoNCmBgYHtyIGlzbGFuZE9uZVR3b30NCiMgRm9yIGVhY2ggZ3JvdXAtZGF0YXNldCwNCiMgRm9yIGVhY2ggcGFpciwNCiMgUnVuIElzbGFuZCBEeW5hbWljcywNCiMgU2F2ZSB0aGUgcmVzdWx0IHdpdGggaXRzIHBhaXJpbmcNCmNhbmRpZGF0ZURhdGEkVG90YWxJRCA8LSBwYXN0ZShjYW5kaWRhdGVEYXRhJENvbWJuTnVtLCBjYW5kaWRhdGVEYXRhJERhdGFzZXRJRCkNCg0KaXNsYW5kSW50ZXJhY3Rpb25zT25lVHdvIDwtIGxpc3QoKQ0KDQpmb3IgKGdycCBpbiB1bmlxdWUoY2FuZGlkYXRlRGF0YSRUb3RhbElEKSkgew0KICBjYW5kaWRhdGVEYXRhU3Vic2V0IDwtIGNhbmRpZGF0ZURhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoVG90YWxJRCA9PSBncnApDQogIA0KICBpZiAobnJvdyhjYW5kaWRhdGVEYXRhU3Vic2V0KSA9PSAxKSBuZXh0KCkNCiAgDQogIHBhaXJpbmdSZXN1bHRzIDwtIGNvbWJuKA0KICAgIG5yb3coY2FuZGlkYXRlRGF0YVN1YnNldCksIDIsIA0KICAgIGlzbGFuZEZVTiwNCiAgICBkYXQgPSBjYW5kaWRhdGVEYXRhU3Vic2V0LCANCiAgICBwb29sID0gcG9vbHNbWw0KICAgICAgY2FuZGlkYXRlRGF0YVN1YnNldCREYXRhc2V0SURbMV0NCiAgICAgIF1dW1tjYW5kaWRhdGVEYXRhU3Vic2V0JENvbWJuTnVtWzFdXV0sDQogICAgbWF0ID0gbWF0c1tbDQogICAgICBjYW5kaWRhdGVEYXRhU3Vic2V0JERhdGFzZXRJRFsxXQ0KICAgICAgXV1bW2NhbmRpZGF0ZURhdGFTdWJzZXQkQ29tYm5OdW1bMV1dXSwNCiAgICBkbWF0ID0gbWF0cml4KGMoMCwgMSwgMSwgMCksIG5yb3cgPSAyLCBuY29sID0gMiksDQogICAgc2ltcGxpZnkgPSBGQUxTRQ0KICApDQogIA0KICBwYWlyaW5nUmVzdWx0cyA8LSBsYXBwbHkoDQogICAgcGFpcmluZ1Jlc3VsdHMsIGZ1bmN0aW9uKG1hdCwgaXNsZXMpIHsNCiAgICAgIG1hdCA8LSBtYXRbbnJvdyhtYXQpLCAtMV0NCiAgICAgIHJldFZhbCA8LSBsaXN0KCkNCiAgICAgIHNwZWNpZXMgPC0gbGVuZ3RoKG1hdCkgLyBpc2xlcw0KICAgICAgZm9yIChpIGluIDE6aXNsZXMpIHsNCiAgICAgICAgcmV0VmFsW1tpXV0gPC0gbWF0WygoaSAtIDEpICogc3BlY2llcyArIDEpIDogKGkgKiBzcGVjaWVzKV0NCiAgICAgIH0NCiAgICAgIHJldFZhbA0KICAgIH0sDQogICAgaXNsZXMgPSAyDQogICkNCiAgDQogIGlzbGFuZEludGVyYWN0aW9uc09uZVR3b1tbZ3JwXV0gPC0gcGFpcmluZ1Jlc3VsdHMNCn0NCmBgYA0KDQpgYGB7ciBpc2xhbmRPbmVFbXB0eVR3b30NCmlzbGFuZEludGVyYWN0aW9uc09uZUVtcHR5VHdvIDwtIGxpc3QoKQ0KDQpmb3IgKGdycCBpbiB1bmlxdWUoY2FuZGlkYXRlRGF0YSRUb3RhbElEKSkgew0KICBjYW5kaWRhdGVEYXRhU3Vic2V0IDwtIGNhbmRpZGF0ZURhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoVG90YWxJRCA9PSBncnApDQogIA0KICBpZiAobnJvdyhjYW5kaWRhdGVEYXRhU3Vic2V0KSA9PSAxKSBuZXh0KCkNCiAgDQogIHBhaXJpbmdSZXN1bHRzIDwtIGNvbWJuKA0KICAgIG5yb3coY2FuZGlkYXRlRGF0YVN1YnNldCksIDIsIA0KICAgIGlzbGFuZEZVTiwNCiAgICBkYXQgPSBjYW5kaWRhdGVEYXRhU3Vic2V0LCANCiAgICBwb29sID0gcG9vbHNbWw0KICAgICAgY2FuZGlkYXRlRGF0YVN1YnNldCREYXRhc2V0SURbMV0NCiAgICAgIF1dW1tjYW5kaWRhdGVEYXRhU3Vic2V0JENvbWJuTnVtWzFdXV0sDQogICAgbWF0ID0gbWF0c1tbDQogICAgICBjYW5kaWRhdGVEYXRhU3Vic2V0JERhdGFzZXRJRFsxXQ0KICAgICAgXV1bW2NhbmRpZGF0ZURhdGFTdWJzZXQkQ29tYm5OdW1bMV1dXSwNCiAgICBkbWF0ID0gbWF0cml4KGMoDQogICAgICAwLCAxLCAwLCAjIElzbGFuZCAyIC0+IDENCiAgICAgIDEsIDAsIDEsICMgSXNsYW5kIDEgLT4gMiwgSXNsYW5kIDMgLT4gMg0KICAgICAgMCwgMSwgMCAgIyBJc2xhbmQgMiAtPiAzDQogICAgKSwgbnJvdyA9IDMsIG5jb2wgPSAzLCBieXJvdyA9IFRSVUUpLA0KICAgIHNpbXBsaWZ5ID0gRkFMU0UNCiAgKQ0KICANCiAgcGFpcmluZ1Jlc3VsdHMgPC0gbGFwcGx5KA0KICAgIHBhaXJpbmdSZXN1bHRzLCBmdW5jdGlvbihtYXQsIGlzbGVzKSB7DQogICAgICBtYXQgPC0gbWF0W25yb3cobWF0KSwgLTFdDQogICAgICByZXRWYWwgPC0gbGlzdCgpDQogICAgICBzcGVjaWVzIDwtIGxlbmd0aChtYXQpIC8gaXNsZXMNCiAgICAgIGZvciAoaSBpbiAxOmlzbGVzKSB7DQogICAgICAgIHJldFZhbFtbaV1dIDwtIG1hdFsoKGkgLSAxKSAqIHNwZWNpZXMgKyAxKSA6IChpICogc3BlY2llcyldDQogICAgICB9DQogICAgICByZXRWYWwNCiAgICB9LA0KICAgIGlzbGVzID0gMw0KICApDQogIA0KICBpc2xhbmRJbnRlcmFjdGlvbnNPbmVFbXB0eVR3b1tbZ3JwXV0gPC0gcGFpcmluZ1Jlc3VsdHMNCn0NCmBgYA0KDQpgYGB7ciBjb21wYXJlSXNsYW5kRHluYW1pY3N9DQojIEZvcm1hdCBvZiB0YWJsZSBzaG91bGQgYmU6DQojIElELCBDb21tdW5pdHkgMSwgQ29tbXVuaXR5IDIsIE91dGNvbWVzIDEtMiwgT3V0Y29tZXMgMS0wLTINCiMgRm9yIG91dGNvbWVzLCBzcGVjaWVzIHByZXNlbmNlIHdpbGwgYmUgdXNlZC4NCg0KY29tbXVuaXRpZXMgPC0gTlVMTA0KcHJvZHVjdGl2aXRpZXMgPC0gTlVMTA0KdG90YWxDb21tdW5pdGllcyA8LSBOVUxMDQpmb3IgKGdycCBpbiB1bmlxdWUoY2FuZGlkYXRlRGF0YSRUb3RhbElEKSkgew0KICBjYW5kaWRhdGVEYXRhU3Vic2V0IDwtIGNhbmRpZGF0ZURhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoVG90YWxJRCA9PSBncnApDQogIA0KICBpZiAobnJvdyhjYW5kaWRhdGVEYXRhU3Vic2V0KSA+IDEpIHsNCiAgICBuZXdDb21tdW5pdGllcyA8LSBjb21ibigNCiAgICAgIGNhbmRpZGF0ZURhdGFTdWJzZXQkQ29tbXVuaXRpZXMsIDIsIA0KICAgICkNCiAgICBuZXdQcm9kdWN0aXZpdGllcyA8LSBjb21ibigNCiAgICAgIGNhbmRpZGF0ZURhdGFTdWJzZXQkQ29tbXVuaXR5UHJvZCwgMiwgDQogICAgKQ0KICAgIGNvbW11bml0aWVzIDwtIGMoY29tbXVuaXRpZXMsIG5ld0NvbW11bml0aWVzKQ0KICAgIHByb2R1Y3Rpdml0aWVzIDwtIGMocHJvZHVjdGl2aXRpZXMsIG5ld1Byb2R1Y3Rpdml0aWVzKQ0KICAgIHRvdGFsQ29tbXVuaXRpZXMgPC0gYygNCiAgICAgIHRvdGFsQ29tbXVuaXRpZXMsDQogICAgICB0b1N0cmluZyhzb3J0KHVuaXF1ZSh1bmxpc3QobGFwcGx5KG5ld0NvbW11bml0aWVzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk1UUkNvZGUyOjpDc3ZSb3dTcGxpdCkpKSkpDQogICAgKQ0KICB9DQp9DQoNCmlzbGFuZEludGVyYWN0aW9uc09uZVR3b1doaWNoIDwtIHVubGlzdChsYXBwbHkoDQogIHNlcV9hbG9uZyhpc2xhbmRJbnRlcmFjdGlvbnNPbmVUd28pLCBmdW5jdGlvbihpLCB4LCB0Qykgew0KICAgIGxhcHBseSh4W1tpXV0sIGZ1bmN0aW9uKHksIHRDKSB7DQogICAgICBsYXBwbHkoeSwgZnVuY3Rpb24oeiwgdEMpIHsNCiAgICAgICAgdG9TdHJpbmcoUk1UUkNvZGUyOjpDc3ZSb3dTcGxpdCh0Qylbd2hpY2goeiA+IDFFLTYpXSkNCiAgICAgIH0sIHRDID0gdEMpDQogICAgICB9LA0KICAgICAgdEMgPSB0Q1tpXSkNCiAgfSwNCiAgeCA9IGlzbGFuZEludGVyYWN0aW9uc09uZVR3bywNCiAgdEMgPSB0b3RhbENvbW11bml0aWVzKSkNCg0KaXNsYW5kSW50ZXJhY3Rpb25zT25lRW1wdHlUd29XaGljaCA8LSB1bmxpc3QobGFwcGx5KA0KICBzZXFfYWxvbmcoaXNsYW5kSW50ZXJhY3Rpb25zT25lRW1wdHlUd28pLCBmdW5jdGlvbihpLCB4LCB0Qykgew0KICAgIGxhcHBseSh4W1tpXV0sIGZ1bmN0aW9uKHksIHRDKSB7DQogICAgICBsYXBwbHkoeSwgZnVuY3Rpb24oeiwgdEMpIHsNCiAgICAgICAgdG9TdHJpbmcoUk1UUkNvZGUyOjpDc3ZSb3dTcGxpdCh0Qylbd2hpY2goeiA+IDFFLTYpXSkNCiAgICAgIH0sIHRDID0gdEMpDQogICAgICB9LA0KICAgICAgdEMgPSB0Q1tpXSkNCiAgfSwNCiAgeCA9IGlzbGFuZEludGVyYWN0aW9uc09uZUVtcHR5VHdvLA0KICB0QyA9IHRvdGFsQ29tbXVuaXRpZXMpKQ0KDQoNCmlzbGFuZEludGVyYWN0aW9uUmVzdWx0cyA8LSBkYXRhLmZyYW1lKA0KICBEYXRhc2V0SUQgPSByZXAobmFtZXMoaXNsYW5kSW50ZXJhY3Rpb25zT25lVHdvKSwgDQogICAgICAgICAgICAgICAgICB1bmxpc3QobGFwcGx5KGlzbGFuZEludGVyYWN0aW9uc09uZVR3bywgbGVuZ3RoKSkpLA0KICBDb21tdW5pdHkxID0gY29tbXVuaXRpZXNbc2VxKGZyb20gPSAxLCB0byA9IGxlbmd0aChjb21tdW5pdGllcyksIGJ5ID0gMildLA0KICBQcm9kdWN0aXZpdHkxID0gcHJvZHVjdGl2aXRpZXNbc2VxKGZyb20gPSAxLCB0byA9IGxlbmd0aChwcm9kdWN0aXZpdGllcyksIGJ5ID0gMildLA0KICBDb21tdW5pdHkyID0gY29tbXVuaXRpZXNbc2VxKGZyb20gPSAyLCB0byA9IGxlbmd0aChjb21tdW5pdGllcyksIGJ5ID0gMildLA0KICBQcm9kdWN0aXZpdHkyID0gcHJvZHVjdGl2aXRpZXNbc2VxKGZyb20gPSAyLCB0byA9IGxlbmd0aChwcm9kdWN0aXZpdGllcyksIGJ5ID0gMildLA0KICBPdXRjb21lV09FbXB0eV9Jc2xhbmQxID0gaXNsYW5kSW50ZXJhY3Rpb25zT25lVHdvV2hpY2hbDQogICAgc2VxKGZyb20gPSAxLCB0byA9IGxlbmd0aChpc2xhbmRJbnRlcmFjdGlvbnNPbmVUd29XaGljaCksIGJ5ID0gMildLA0KICBPdXRjb21lV09FbXB0eV9Jc2xhbmQyID0gaXNsYW5kSW50ZXJhY3Rpb25zT25lVHdvV2hpY2hbDQogICAgc2VxKGZyb20gPSAxLCB0byA9IGxlbmd0aChpc2xhbmRJbnRlcmFjdGlvbnNPbmVUd29XaGljaCksIGJ5ID0gMildLA0KICBPdXRjb21lV0VtcHR5X0lzbGFuZDEgPSBpc2xhbmRJbnRlcmFjdGlvbnNPbmVFbXB0eVR3b1doaWNoWw0KICAgIHNlcShmcm9tID0gMSwgdG8gPSBsZW5ndGgoaXNsYW5kSW50ZXJhY3Rpb25zT25lRW1wdHlUd29XaGljaCksIGJ5ID0gMyldLA0KICBPdXRjb21lV0VtcHR5X0lzbGFuZDIgPSBpc2xhbmRJbnRlcmFjdGlvbnNPbmVFbXB0eVR3b1doaWNoWw0KICAgIHNlcShmcm9tID0gMSwgdG8gPSBsZW5ndGgoaXNsYW5kSW50ZXJhY3Rpb25zT25lRW1wdHlUd29XaGljaCksIGJ5ID0gMyldLA0KICBPdXRjb21lV0VtcHR5X0lzbGFuZDMgPSBpc2xhbmRJbnRlcmFjdGlvbnNPbmVFbXB0eVR3b1doaWNoWw0KICAgIHNlcShmcm9tID0gMSwgdG8gPSBsZW5ndGgoaXNsYW5kSW50ZXJhY3Rpb25zT25lRW1wdHlUd29XaGljaCksIGJ5ID0gMyldDQopDQoNCmlzbGFuZEludGVyYWN0aW9uUmVzdWx0cw0KYGBgDQoNCmBgYHtyIG1hdGNoZXN9DQppc2xhbmRJbnRlcmFjdGlvblJlc3VsdHMgJT4lIGRwbHlyOjptdXRhdGUoDQogIEMxV09JbnZhZGVkID0gQ29tbXVuaXR5MSAhPSBPdXRjb21lV09FbXB0eV9Jc2xhbmQxLA0KICBDMldPSW52YWRlZCA9IENvbW11bml0eTIgIT0gT3V0Y29tZVdPRW1wdHlfSXNsYW5kMiwNCiAgQzFXSW52YWRlZCA9IENvbW11bml0eTEgIT0gT3V0Y29tZVdFbXB0eV9Jc2xhbmQxLA0KICBDMldJbnZhZGVkID0gQ29tbXVuaXR5MiAhPSBPdXRjb21lV0VtcHR5X0lzbGFuZDMsDQogIFN0YWxlbWF0ZVdPID0gIUMxV09JbnZhZGVkICYgIUMyV09JbnZhZGVkLA0KICBTdGFsZW1hdGVXID0gIUMxV0ludmFkZWQgJiAhQzJXSW52YWRlZCwNCiAgSHlicmlkV08gPSBDMVdPSW52YWRlZCAmIEMyV09JbnZhZGVkLA0KICBIeWJyaWRXID0gQzFXSW52YWRlZCAmIEMyV0ludmFkZWQsDQogIFByb2REaWZmID0gUHJvZHVjdGl2aXR5MSAtIFByb2R1Y3Rpdml0eTINCikgJT4lIGRwbHlyOjpzZWxlY3QoLWRwbHlyOjpzdGFydHNfd2l0aCgiT3V0Y29tZSIpKQ0KYGBgDQo=